package com.woniuxy.controller;

import com.woniuxy.entity.DTO.algorithm.UserPredictionDTO;
import com.woniuxy.service.IUserPredictionService;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

/**
 * @Author 陈华庆
 * @Date 2025/7/22 20:08
 * @Description TODO
 * 用户增长预测控制器
 * 独立于用户管理控制器，专注于预测相关API
 * 支持30/90天预测，可按年级细分
 */
/*
- 1.
预测算法选择 ：采用指数平滑法作为基础模型，平衡了准确性和计算复杂度，适合用户增长这类有趋势但波动不大的场景
- 2.
特征融合 ：特别处理了 grade 和 is_auth 两个业务特征，通过历史数据统计调整预测权重
- 3.
工程化考虑 ：
- 独立的预测服务接口，便于未来替换更复杂的模型
- 完整的置信区间计算，提供预测可靠性评估
- 日期补全逻辑确保时间序列连续性
 */
@RestController
@RequestMapping("/user/predict")
public class UserPredictionController {

    @Autowired
    private IUserPredictionService userPredictionService;

    /**
     * 获取用户增长预测
     * @param days 预测天数（30或90）
     * @param includeGrade 是否按年级细分（默认false）
     */
    @GetMapping("/growth")
    public ResponseData<List<UserPredictionDTO>> predictUserGrowth(
            @RequestParam("days") int days,
            @RequestParam(value = "includeGrade",required = false, defaultValue = "false") boolean includeGrade) {
        // 参数校验：只允许30或90天
        if (days != 30 && days != 90) {
            return ResponseData.fail(400, "仅支持30天或90天预测");
        }

        return userPredictionService.predictUserGrowth(days, includeGrade);
    }
}